package com.luxsoft.siipap.migracion.parches;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowCallbackHandler;

import com.luxsoft.siipap.model.core.Producto;
import com.luxsoft.siipap.service.ServiceLocator2;
import com.luxsoft.siipap.util.DBUtils;

/**
 * Actualiza los articulos de Oracle a partir de la base de MySQL de produccion
 * 
 * Es manual y requiere de mucho cuidado al ejecutar, se debe configurar ServiceLocator2 para utilizar la base
 * de MySWL de producttion en ser-ofi-d/sw2.
 * Se debe ejecutar en partes del 0 al 3000 etc . Esta comentado en el codigo
 * 
 * @author Ruben Cancino
 *
 */
public class ActualizaArticulosMySQLToOracle {
	
	
	public void execute(){
		final List<Producto> productos=ServiceLocator2.getProductoManager().getAll();
		JdbcTemplate target=ServiceLocator2.getAnalisisJdbcTemplate();
		//target.setFetchSize(20);
		//for(int i=0;i<3000;i++){
		//for(int i=2354;i<3520;i++){
		for(int i=3520;i<productos.size();i++){
			Producto p=productos.get(i);
			String sql="update sw_articulos set " +
					"linea=? " +
					",marca=? " +
					",clase=? " +
					",nacional=? " +
					",presentacion=? " +
					//",precioNeto=? " +
					",caras=? " +
					",acabado=? " +
					",gramos=?" +
					"where clave=?";
			int res=target.update(sql
					, new Object[]{
					p.getLinea().getNombre()					
					,p.getMarca()!=null?p.getMarca().getNombre():null
					,p.getClase()!=null?p.getClase().getNombre():null
					,p.isNacional()
					,p.getPresentacion().name()
					//,p.getModoDeVenta()==null?false:p.getModoDeVenta().equals("N")?true:false
					,p.getCaras()
					,p.getAcabado()
					,p.getGramos()
					,p.getClave().trim()});
			System.out.println("Actualizado: "+res+" Prod:"+p+" row:"+i);			
		}
		
		/*
		for(int i=0;i<100;i++){
			String sql="update sw_articulos set linea=? where clave=?";
			ServiceLocator2.getAnalisisJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter(){
				public int getBatchSize() {
					return 20;
				}

				public void setValues(PreparedStatement ps, int i)
						throws SQLException {
					
					
				}
				
			});
		}
		*/
		
		/*
		ServiceLocator2.getAnalisisJdbcTemplate().query("select * from SW_ARTICULOS", new Object[]{},new RowCallbackHandler(){
			
			public void processRow(ResultSet rs) throws SQLException {
				final String clave=rs.getString("CLAVE");
				Producto res=(Producto)CollectionUtils.find(productos, new Predicate(){
					public boolean evaluate(Object input) {
						Producto p=(Producto)input;
						return clave.equals(p.getClave().trim());
					}
				});
				if(res!=null){
					String linea=res.getLinea().getNombre();
					rs.updateString("LINEA", linea);
					System.out.println("Actualizando linea, marca y clase para el producto: "+clave);
				}else{
					System.out.println("NO ENCONTRO CLAVE EN MYSQL: "+clave);
				}
				
			}
			
		});
		*/
		
		
	}
	
	
	public static void main(String[] args) {
		DBUtils.whereWeAre(); //Verifica la base de origen
		new ActualizaArticulosMySQLToOracle().execute();
	}

}
